<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 4.2.0">
  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/ice.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/ice.png">
  <link rel="mask-icon" href="/images/logo.svg" color="#222">

<link rel="stylesheet" href="/css/main.css">


<link rel="stylesheet" href="/lib/font-awesome/css/all.min.css">

<script id="hexo-configurations">
    var NexT = window.NexT || {};
    var CONFIG = {"hostname":"yoursite.com","root":"/","scheme":"Gemini","version":"7.8.0","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12,"onmobile":false},"copycode":{"enable":true,"show_result":true,"style":null},"back2top":{"enable":true,"sidebar":false,"scrollpercent":false},"bookmark":{"enable":false,"color":"#222","save":"auto"},"fancybox":false,"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"algolia":{"hits":{"per_page":10},"labels":{"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}},"localsearch":{"enable":true,"trigger":"auto","top_n_per_article":3,"unescape":false,"preload":false},"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},"path":"search.xml"};
  </script>

  <meta name="description" content="关系数据库 读写分离（减轻访问压力）  基本原理：将数据库读写操作分散到不同节点上，减小单个数据库的访问压力，提高访问效率。">
<meta property="og:type" content="article">
<meta property="og:title" content="存储高性能">
<meta property="og:url" content="http://yoursite.com/2020/05/30/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%AD%A6%E6%9E%B6%E6%9E%84--%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/%E3%80%8A%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%AD%A6%E6%9E%B6%E6%9E%84%E3%80%8B%E7%AC%94%E8%AE%B0%E2%80%94%E2%80%94%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86%EF%BC%9A%E9%AB%98%E6%80%A7%E8%83%BD%E5%92%8C%E9%AB%98%E5%8F%AF%E7%94%A8%E6%9E%B6%E6%9E%84%E6%A8%A1%E5%BC%8F/index.html">
<meta property="og:site_name" content="严冰的博客">
<meta property="og:description" content="关系数据库 读写分离（减轻访问压力）  基本原理：将数据库读写操作分散到不同节点上，减小单个数据库的访问压力，提高访问效率。">
<meta property="og:locale" content="zh_CN">
<meta property="article:published_time" content="2020-05-30T12:50:49.000Z">
<meta property="article:modified_time" content="2020-06-18T00:01:07.887Z">
<meta property="article:author" content="yanbing">
<meta name="twitter:card" content="summary">

<link rel="canonical" href="http://yoursite.com/2020/05/30/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%AD%A6%E6%9E%B6%E6%9E%84--%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/%E3%80%8A%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%AD%A6%E6%9E%B6%E6%9E%84%E3%80%8B%E7%AC%94%E8%AE%B0%E2%80%94%E2%80%94%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86%EF%BC%9A%E9%AB%98%E6%80%A7%E8%83%BD%E5%92%8C%E9%AB%98%E5%8F%AF%E7%94%A8%E6%9E%B6%E6%9E%84%E6%A8%A1%E5%BC%8F/">


<script id="page-configurations">
  // https://hexo.io/docs/variables.html
  CONFIG.page = {
    sidebar: "",
    isHome : false,
    isPost : true,
    lang   : 'zh-CN'
  };
</script>

  <title>存储高性能 | 严冰的博客</title>
  






  <noscript>
  <style>
  .use-motion .brand,
  .use-motion .menu-item,
  .sidebar-inner,
  .use-motion .post-block,
  .use-motion .pagination,
  .use-motion .comments,
  .use-motion .post-header,
  .use-motion .post-body,
  .use-motion .collection-header { opacity: initial; }

  .use-motion .site-title,
  .use-motion .site-subtitle {
    opacity: initial;
    top: initial;
  }

  .use-motion .logo-line-before i { left: initial; }
  .use-motion .logo-line-after i { right: initial; }
  </style>
</noscript>

<link rel="alternate" href="/atom.xml" title="严冰的博客" type="application/atom+xml">
</head>

<body itemscope itemtype="http://schema.org/WebPage">
  <div class="container use-motion">
    <div class="headband"></div>

    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="切换导航栏">
      <span class="toggle-line toggle-line-first"></span>
      <span class="toggle-line toggle-line-middle"></span>
      <span class="toggle-line toggle-line-last"></span>
    </div>
  </div>

  <div class="site-meta">

    <a href="/" class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <h1 class="site-title">严冰的博客</h1>
      <span class="logo-line-after"><i></i></span>
    </a>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger">
        <i class="fa fa-search fa-fw fa-lg"></i>
    </div>
  </div>
</div>




<nav class="site-nav">
  <ul id="menu" class="main-menu menu">
        <li class="menu-item menu-item-home">

    <a href="/" rel="section"><i class="fa fa-home fa-fw"></i>首页</a>

  </li>
        <li class="menu-item menu-item-categories">

    <a href="/categories/" rel="section"><i class="fa fa-th fa-fw"></i>分类</a>

  </li>
        <li class="menu-item menu-item-tags">

    <a href="/tags/" rel="section"><i class="fa fa-tags fa-fw"></i>标签</a>

  </li>
        <li class="menu-item menu-item-archives">

    <a href="/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>归档</a>

  </li>
      <li class="menu-item menu-item-search">
        <a role="button" class="popup-trigger"><i class="fa fa-search fa-fw"></i>搜索
        </a>
      </li>
  </ul>
</nav>



  <div class="search-pop-overlay">
    <div class="popup search-popup">
        <div class="search-header">
  <span class="search-icon">
    <i class="fa fa-search"></i>
  </span>
  <div class="search-input-container">
    <input autocomplete="off" autocapitalize="off"
           placeholder="搜索..." spellcheck="false"
           type="search" class="search-input">
  </div>
  <span class="popup-btn-close">
    <i class="fa fa-times-circle"></i>
  </span>
</div>
<div id="search-result">
  <div id="no-result">
    <i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>
  </div>
</div>

    </div>
  </div>

</div>
    </header>

    
  <div class="back-to-top">
    <i class="fa fa-arrow-up"></i>
    <span>0%</span>
  </div>


    <main class="main">
      <div class="main-inner">
        <div class="content-wrap">
          

          <div class="content post posts-expand">
            

    
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-CN">
    <link itemprop="mainEntityOfPage" href="http://yoursite.com/2020/05/30/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%AD%A6%E6%9E%B6%E6%9E%84--%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/%E3%80%8A%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%AD%A6%E6%9E%B6%E6%9E%84%E3%80%8B%E7%AC%94%E8%AE%B0%E2%80%94%E2%80%94%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86%EF%BC%9A%E9%AB%98%E6%80%A7%E8%83%BD%E5%92%8C%E9%AB%98%E5%8F%AF%E7%94%A8%E6%9E%B6%E6%9E%84%E6%A8%A1%E5%BC%8F/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/dog.jpg">
      <meta itemprop="name" content="yanbing">
      <meta itemprop="description" content="闲看庭前花开落，漫随天外云卷舒。">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="严冰的博客">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          存储高性能
        </h1>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-calendar"></i>
              </span>
              <span class="post-meta-item-text">发表于</span>

              <time title="创建时间：2020-05-30 20:50:49" itemprop="dateCreated datePublished" datetime="2020-05-30T20:50:49+08:00">2020-05-30</time>
            </span>
              <span class="post-meta-item">
                <span class="post-meta-item-icon">
                  <i class="far fa-calendar-check"></i>
                </span>
                <span class="post-meta-item-text">更新于</span>
                <time title="修改时间：2020-06-18 08:01:07" itemprop="dateModified" datetime="2020-06-18T08:01:07+08:00">2020-06-18</time>
              </span>
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-folder"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/%E6%9E%B6%E6%9E%84-%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/" itemprop="url" rel="index"><span itemprop="name">架构--阅读笔记</span></a>
                </span>
            </span>

          

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
        <h4 id="关系数据库"><a href="#关系数据库" class="headerlink" title="关系数据库"></a>关系数据库</h4><ul>
<li>读写分离（减轻访问压力）</li>
</ul>
<p>基本原理：将数据库读写操作分散到不同节点上，减小单个数据库的访问压力，提高访问效率。</p>
<a id="more"></a>
<p>基本实现：</p>
<p>数据库服务器搭建主从集群，一主一从或者一主多从。<br>数据库主机负责读写操作，从机负责读操作。<br>数据库主机通过复制将数据同步到从机。<br>业务服务器将读写发送到主机，将读发送到从机。<br>事务问题：<strong>一致性</strong>。</p>
<p>【问题】</p>
<p>如何保证主机和从机的数据一致？？？主从复制的延迟性问题。</p>
<ul>
<li>二次读取，读完从机再读一次主机</li>
<li>关键业务指向主机，非关键业务指向从机</li>
<li>分库分表（减轻存储压力）</li>
</ul>
<p><strong>分库</strong></p>
<p>将业务模块分到不同数据库服务器里。比如电商项目中用户，商品，订单就可以防在三台不同的服务器上。</p>
<p>【问题】</p>
<ul>
<li><p>join操作问题</p>
</li>
<li><p>无法实现关联查询</p>
</li>
<li><p>事务问题</p>
</li>
</ul>
<p>数据需要保持一致。比如订单加1商品数量就会减1。（延迟性问题）</p>
<ul>
<li>成本</li>
</ul>
<p><strong>分表</strong></p>
<p>单表数据拆分有水平拆分和垂直拆分两种。</p>
<p>拆分后可以放在同一数据库中，也可以放在不同数据库中。</p>
<ul>
<li>垂直分表</li>
</ul>
<p>将表中不常用的列拆分出去。会带来表数量增加的复杂性。但能显著提高查询效率。</p>
<ul>
<li>水平分表</li>
</ul>
<p>水平分表适合表行数特别大的表。</p>
<pre><code>水平分表的问题</code></pre><ul>
<li><p>路由：根据什么条件拆分表</p>
<ul>
<li><p>范围路由：根据有序的数据列作为路由拆分条件，比如1-999999，1000000-1999999.</p>
<p>  建议段大小在100万到2000万之间</p>
<p>  优缺点：分段大小选取具有复杂性；但可以随着数据增加平滑扩展新的表</p>
</li>
<li><p>Hash路由</p>
</li>
<li><p>配置路由</p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>join操作需要合并结果</p>
</li>
<li><p>order by 操作无法在数据库中进行，只能通过业务代码或者数据库中间件分别查询，然后汇总排序</p>
</li>
</ul>
<h4 id="NoSQL"><a href="#NoSQL" class="headerlink" title="NoSQL"></a>NoSQL</h4><p>NoSQL分类：</p>
<ul>
<li>K-V存储：Redis</li>
<li>文档数据库：MongoDB</li>
<li>列式数据库：HBase</li>
<li>全文搜索引擎：ElasticSearch<h5 id="缓存"><a href="#缓存" class="headerlink" title="缓存"></a>缓存</h5>基本原理：将可能会重用的数据放在内存中，一次生成，多次使用。</li>
</ul>
<p>【一个明星发一条微博，执行一个insert，然后n多个select】</p>
<ul>
<li>缓存穿透</li>
</ul>
<p>缓存没有发挥作用，业务系统向缓存中读取，但并没有数据。</p>
<p>问题：</p>
<p>存储数据不存在<br>缓存需要时间较长</p>
<ul>
<li>缓存雪崩</li>
</ul>
<p>当缓存失效后系统性能急剧下降。很多请求访问数据库，同时生成缓存。</p>
<p>解决方案：</p>
<p>更新锁，只能有一个线程生成缓存。（分布式锁）<br>后台更新。不用业务线程更新，而是用后台线程专门更新。</p>
<ul>
<li>缓存热点</li>
</ul>
<p>复制多份缓存，创建缓存服务器集群，将请求分发到不同服务器上。</p>
<p>【比如新浪微博上粉丝超过100w的明星发的微博，生成100份缓存（当然需要100台服务器）】</p>
<h3 id="第五章-计算高性能"><a href="#第五章-计算高性能" class="headerlink" title="第五章 计算高性能"></a>第五章 计算高性能</h3><p>从物理层面上来说：</p>
<ul>
<li>尽量提升单服务器的性能，将资源发挥到极致</li>
<li>单服务器达到性能瓶颈，设计服务器集群方案</li>
</ul>
<h4 id="集群高性能"><a href="#集群高性能" class="headerlink" title="集群高性能"></a>集群高性能</h4><p>负载均衡代替前面的任务分配。</p>
<h4 id="负载均衡分类"><a href="#负载均衡分类" class="headerlink" title="负载均衡分类"></a>负载均衡分类</h4><ul>
<li><p>DNS负载均衡（实现地理级别的负载均衡）</p>
</li>
<li><p>硬件负载均衡（类似路由交换机）100w以上的并发，就是贵，好一点的就是一台宝马了。</p>
</li>
<li><p>软件负载均衡（Nginx&amp;&amp;LVS)</p>
<h5 id="负载均衡算法"><a href="#负载均衡算法" class="headerlink" title="负载均衡算法"></a>负载均衡算法</h5></li>
<li><p>轮询</p>
</li>
<li><p>加权轮询</p>
</li>
<li><p>负载最低优先<br>Hash类（根据关键信息进行Hash运算，将相同Hash值的请求分发到同一台服务器山）</p>
<h3 id="第六章-分布式系统设计理论CAP"><a href="#第六章-分布式系统设计理论CAP" class="headerlink" title="第六章 分布式系统设计理论CAP"></a>第六章 分布式系统设计理论CAP</h3><p>对于分布式计算系统，只能满足一致性，可用性，分区容错性三个中的两个。</p>
</li>
</ul>
<p>三进二</p>
<ul>
<li>一致性</li>
</ul>
<p>所有节点在同一时刻都能看到相同的数据。（比如MySQL集群主从数据一致性）</p>
<ul>
<li>可用性</li>
</ul>
<p>非故障节点在合理时间返回合理响应。（不能是错误或者超时的响应）</p>
<ul>
<li>分区容错性</li>
</ul>
<p>当出现网络分区后（网络故障，丢包网络中断），系统可以继续运行。</p>
<h4 id="CAP细节"><a href="#CAP细节" class="headerlink" title="CAP细节"></a>CAP细节</h4><ul>
<li>CAP粒度是数据，而不是系统</li>
</ul>
<p>比如用户账号数据选择CP，而其他信息选择AP</p>
<ul>
<li>正常情况下，可以同时满足CA</li>
</ul>
<p>当发生了分区情况，也就是网络故障，才会存在CA的选择，在网络正常的情况下，CA可以同时满足。</p>
<h4 id="ACID："><a href="#ACID：" class="headerlink" title="ACID："></a>ACID：</h4><p>关于数据库事务完整性的理论</p>
<p>原子性：单个事务要么都完成，要么都失败（比如银行转账，一个减，一个加，必须同步）<br>一致性：并发请求下数据保持一致<br>隔离性：防止多个事务并发交叉执行导致的数据不一致问题。（悲观锁和乐观锁实现）<br>持久性：事务结束后，对数据的修改就是永久的，即使系统故障也不会丢失。</p>
<h4 id="BASE"><a href="#BASE" class="headerlink" title="BASE:"></a>BASE:</h4><p>如果无法达到强一致性，那就最终一致性</p>
<ul>
<li>Basically Availible 基本可用</li>
</ul>
<p>分布式系统故障时，保证核心功能可用（保持登录可用，损失注册）</p>
<ul>
<li>Soft Status 软状态</li>
</ul>
<p>数据不一致</p>
<ul>
<li>Eventually Consistency 最终一致性</li>
</ul>
<p>BASE理论是AP方案的延申。</p>
<h3 id="第七章-存储高可用"><a href="#第七章-存储高可用" class="headerlink" title="第七章 存储高可用"></a>第七章 存储高可用</h3><h4 id="主备复制"><a href="#主备复制" class="headerlink" title="主备复制"></a>主备复制</h4><ul>
<li>主机存储数据，将数据复制给备机</li>
<li>备机不提供读写服务</li>
<li>主机发生故障需要人工干预将备机升为主机<h4 id="主从复制"><a href="#主从复制" class="headerlink" title="主从复制"></a>主从复制</h4></li>
<li>主机存储数据，将数据复制给备机</li>
<li>备机提供读服务</li>
<li>主机故障可以进行读业务，发挥了备机的性能</li>
<li>主从复制比主备复制复杂，主要体现在客户端需要识别主从关系</li>
<li>适用写少读多的系统（论坛，新闻网站）<h4 id="主备倒换和主从倒换"><a href="#主备倒换和主从倒换" class="headerlink" title="主备倒换和主从倒换"></a>主备倒换和主从倒换</h4></li>
<li>主备复制和主从复制的共性问题是主机故障，无法进行写操作。</li>
</ul>
<p>主备倒换和主从倒换在原有基础上增加角色倒换的功能。</p>
<ul>
<li>互连式：主备机间建立状态传递的通道。</li>
</ul>
<p>通道可以是网络连接，也可以是串口连接。</p>
<ul>
<li>中介式</li>
</ul>
<p>主备机不进行直接连接，而是通过中介传递信息。（需要中介高可用）</p>
<p>Zookeeper仲裁节点设置节点级别。</p>
<ul>
<li>模拟式</li>
</ul>
<p>将备机模拟成客户端，模拟读写操作。</p>
<h4 id="主主复制"><a href="#主主复制" class="headerlink" title="主主复制"></a>主主复制</h4><ul>
<li>两台主机都有数据，通过复制通道同步</li>
<li>一致性问题很大</li>
<li>适合临时性，可丢失，可覆盖的场景<h4 id="数据分散集群"><a href="#数据分散集群" class="headerlink" title="数据分散集群"></a>数据分散集群</h4>数据分散集群指多个服务器组成一个集群，每台服务器都会存储一部分数据，同时，每台服务器会备份一部分数据。（分库分表）</li>
</ul>
<h4 id="分布式事务算法：保持一致性"><a href="#分布式事务算法：保持一致性" class="headerlink" title="分布式事务算法：保持一致性"></a>分布式事务算法：保持一致性</h4><h5 id="2PC-二阶段提交"><a href="#2PC-二阶段提交" class="headerlink" title="2PC 二阶段提交"></a>2PC 二阶段提交</h5><ul>
<li><p>第一阶段：协调者向所有参与者发送请求（投票阶段）（任一参与者否定都可终止提交）</p>
</li>
<li><p>第二阶段：参与者全部通过请求，协调者提交请求。<br>问题：</p>
</li>
<li><p>同步阻塞：协调者和参与者互相等待</p>
</li>
<li><p>协调者单点故障</p>
<h5 id="3PC-三阶段提交"><a href="#3PC-三阶段提交" class="headerlink" title="3PC 三阶段提交"></a>3PC 三阶段提交</h5></li>
<li><p>第一阶段：协调者向所有参与者发送请求（投票阶段），参与者有否定则事务中止，在超时时间内收到所有yes则进入第二阶段。</p>
</li>
<li><p>第二阶段：协调者发送预提交给参与者，参与者收到信息执行事务操作，返回ACK消息。</p>
</li>
<li><p>第三阶段：协调者收到所有的ACK消息后发送执行提交。参与者执行提交后返回已提交消息给协调者。<br>分布式一致性算法</p>
</li>
<li><p>Paxos（纯理论）</p>
</li>
</ul>
<p>特别复杂</p>
<p>多数一致性<br>读操作也会将算法完全执行一遍</p>
<ul>
<li>Raft</li>
</ul>
<p>Leader选举<br>日志复制<br>安全保证</p>
<ul>
<li>ZAB</li>
</ul>
<p>Zookeeper采用的分布式一致性算法</p>
<h3 id="第八章-计算高可用"><a href="#第八章-计算高可用" class="headerlink" title="第八章 计算高可用"></a>第八章 计算高可用</h3><p>当部分硬件损坏时，计算任务可以正常运行。</p>
<p>基本思想：通过增加更多的服务器达到计算高可用。</p>
<h4 id="主备"><a href="#主备" class="headerlink" title="主备"></a>主备</h4><ul>
<li><p>主机执行所有的计算任务</p>
</li>
<li><p>当主机损坏且无法恢复时，需要人工将备机升至主机，并且增加新的备机</p>
</li>
<li><p>冷备：程序包和配置文件准备好，启动服务器，但业务不启动；温备：业务已启动，但不对外提供服务</p>
</li>
<li><p>适用内部管理系统，后台管理系统的等使用人数不多的情况</p>
</li>
</ul>
<h4 id="主从"><a href="#主从" class="headerlink" title="主从"></a>主从</h4><ul>
<li>主机执行部分任务，备机执行部分任务</li>
<li>主机故障，任务分发不变，即使主机无法正常运作</li>
<li>需要人工将备机升为主机，并添加新的备机</li>
</ul>
<h4 id="对称集群（负载均衡集群）"><a href="#对称集群（负载均衡集群）" class="headerlink" title="对称集群（负载均衡集群）"></a>对称集群（负载均衡集群）</h4><ul>
<li><p>正常情况下，任务分配器将任务分配给不同的主机</p>
</li>
<li><p>当某台服务器故障后，任务分配器将跳过该台服务器</p>
</li>
<li><p>当故障服务器恢复后，重新分配任务</p>
<h4 id="非对称集群"><a href="#非对称集群" class="headerlink" title="非对称集群"></a>非对称集群</h4><p>Master-Slave</p>
</li>
<li><p>集群通过某种方式区分服务器角色，选出Master服务器</p>
</li>
<li><p>当Master服务器故障后，推选出新的Master服务器</p>
</li>
<li><p>Zookeeper通过ZAB协议选取Master</p>
</li>
</ul>
<h3 id="第九章-业务高可用"><a href="#第九章-业务高可用" class="headerlink" title="第九章 业务高可用"></a>第九章 业务高可用</h3><p>异地多活<br>机房断电，机房火灾，城市地震…（但是鸡蛋也不是那么容易碎的）（不要把鸡蛋放在一个篮子里）</p>
<p>同城异区<br>跨城异地<br>跨国异地</p>
<h4 id="异地多活设计技巧"><a href="#异地多活设计技巧" class="headerlink" title="异地多活设计技巧"></a>异地多活设计技巧</h4><ul>
<li>保证核心业务的异地多活</li>
<li>核心数据最终一致（异地多活不可能很快）</li>
<li>采用多种手段同步数据<ul>
<li>消息队列</li>
<li>二次读取<ul>
<li>回源读取等等<br>保证大部分地区的异地多活（无法达到100%）<h4 id="异地多活设计步骤"><a href="#异地多活设计步骤" class="headerlink" title="异地多活设计步骤"></a>异地多活设计步骤</h4></li>
</ul>
</li>
</ul>
</li>
<li>业务分级（挑选核心业务）</li>
<li>数据分类（数据量，唯一性，实时性，可恢复性）</li>
<li>数据同步（存储系统同步，消息队列同步等等）</li>
<li>异常处理（多通道同步，同步和访问结合，日志记录，用户补偿）<h4 id="接口级故障应对方案"><a href="#接口级故障应对方案" class="headerlink" title="接口级故障应对方案"></a>接口级故障应对方案</h4>相对与概率小的机房火灾，断电等故障，接口故障发生的情况更多。</li>
</ul>
<p>接口级故障：</p>
<ul>
<li>内部：程序问题，计算机性能到达极限，导致数据库慢查询</li>
<li>外部：黑客攻击，促销抢购导致用户访问量突增，第三方响应缓慢等</li>
</ul>
<h4 id="降级"><a href="#降级" class="headerlink" title="降级"></a>降级</h4><p>降级是着眼与整个系统的高可用，丢车保帅的一种行为。</p>
<p>比如论坛的系统接近负载，暂停发帖子功能，只能看帖子。</p>
<p>（如果系统持续负载，服务器崩溃，看帖子的功能也废了）</p>
<h4 id="熔断："><a href="#熔断：" class="headerlink" title="熔断："></a>熔断：</h4><p>是降级的一种情况。换句话说，熔断会导致降级。</p>
<p>熔断是指请求达到一个阈值，暂停该服务的调用，防止系统负载过大，导致崩溃。</p>
<h4 id="限流"><a href="#限流" class="headerlink" title="限流"></a>限流</h4><p>只让一部分访问通过。保证一部分响应优于全部不能响应。</p>
<ul>
<li>基于请求限流（控制阈值）</li>
<li>基于资源限流（对关键资源限流，比如线程池最大并发量）</li>
</ul>

    </div>

    
    
    
        

<div>
<ul class="post-copyright">
  <li class="post-copyright-author">
    <strong>本文作者： </strong>yanbing
  </li>
  <li class="post-copyright-link">
    <strong>本文链接：</strong>
    <a href="http://yoursite.com/2020/05/30/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%AD%A6%E6%9E%B6%E6%9E%84--%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/%E3%80%8A%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%AD%A6%E6%9E%B6%E6%9E%84%E3%80%8B%E7%AC%94%E8%AE%B0%E2%80%94%E2%80%94%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86%EF%BC%9A%E9%AB%98%E6%80%A7%E8%83%BD%E5%92%8C%E9%AB%98%E5%8F%AF%E7%94%A8%E6%9E%B6%E6%9E%84%E6%A8%A1%E5%BC%8F/" title="存储高性能">http://yoursite.com/2020/05/30/从零开始学架构--阅读笔记/《从零开始学架构》笔记——第二部分：高性能和高可用架构模式/</a>
  </li>
  <li class="post-copyright-license">
    <strong>版权声明： </strong>本博客所有文章除特别声明外，均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" rel="noopener" target="_blank"><i class="fab fa-fw fa-creative-commons"></i>BY-NC-SA</a> 许可协议。转载请注明出处！
  </li>
</ul>
</div>


      <footer class="post-footer">

        


        
    <div class="post-nav">
      <div class="post-nav-item">
    <a href="/2020/05/30/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%AD%A6%E6%9E%B6%E6%9E%84--%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86%EF%BC%9A%E6%A6%82%E5%BF%B5%E5%92%8C%E5%9F%BA%E7%A1%80/" rel="prev" title="架构基础">
      <i class="fa fa-chevron-left"></i> 架构基础
    </a></div>
      <div class="post-nav-item">
    <a href="/2020/05/30/Java%E5%9F%BA%E7%A1%80/Java%E9%9B%86%E5%90%88/" rel="next" title="Java集合">
      Java集合 <i class="fa fa-chevron-right"></i>
    </a></div>
    </div>
      </footer>
    
  </article>
  
  
  



          </div>
          

<script>
  window.addEventListener('tabs:register', () => {
    let { activeClass } = CONFIG.comments;
    if (CONFIG.comments.storage) {
      activeClass = localStorage.getItem('comments_active') || activeClass;
    }
    if (activeClass) {
      let activeTab = document.querySelector(`a[href="#comment-${activeClass}"]`);
      if (activeTab) {
        activeTab.click();
      }
    }
  });
  if (CONFIG.comments.storage) {
    window.addEventListener('tabs:click', event => {
      if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return;
      let commentClass = event.target.classList[1];
      localStorage.setItem('comments_active', commentClass);
    });
  }
</script>

        </div>
          
  
  <div class="toggle sidebar-toggle">
    <span class="toggle-line toggle-line-first"></span>
    <span class="toggle-line toggle-line-middle"></span>
    <span class="toggle-line toggle-line-last"></span>
  </div>

  <aside class="sidebar">
    <div class="sidebar-inner">

      <ul class="sidebar-nav motion-element">
        <li class="sidebar-nav-toc">
          文章目录
        </li>
        <li class="sidebar-nav-overview">
          站点概览
        </li>
      </ul>

      <!--noindex-->
      <div class="post-toc-wrap sidebar-panel">
          <div class="post-toc motion-element"><ol class="nav"><li class="nav-item nav-level-4"><a class="nav-link" href="#关系数据库"><span class="nav-number">1.</span> <span class="nav-text">关系数据库</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#NoSQL"><span class="nav-number">2.</span> <span class="nav-text">NoSQL</span></a><ol class="nav-child"><li class="nav-item nav-level-5"><a class="nav-link" href="#缓存"><span class="nav-number">2.1.</span> <span class="nav-text">缓存</span></a></li></ol></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#第五章-计算高性能"><span class="nav-number"></span> <span class="nav-text">第五章 计算高性能</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#集群高性能"><span class="nav-number">1.</span> <span class="nav-text">集群高性能</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#负载均衡分类"><span class="nav-number">2.</span> <span class="nav-text">负载均衡分类</span></a><ol class="nav-child"><li class="nav-item nav-level-5"><a class="nav-link" href="#负载均衡算法"><span class="nav-number">2.1.</span> <span class="nav-text">负载均衡算法</span></a></li></ol></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#第六章-分布式系统设计理论CAP"><span class="nav-number"></span> <span class="nav-text">第六章 分布式系统设计理论CAP</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#CAP细节"><span class="nav-number">1.</span> <span class="nav-text">CAP细节</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#ACID："><span class="nav-number">2.</span> <span class="nav-text">ACID：</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#BASE"><span class="nav-number">3.</span> <span class="nav-text">BASE:</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#第七章-存储高可用"><span class="nav-number"></span> <span class="nav-text">第七章 存储高可用</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#主备复制"><span class="nav-number">1.</span> <span class="nav-text">主备复制</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#主从复制"><span class="nav-number">2.</span> <span class="nav-text">主从复制</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#主备倒换和主从倒换"><span class="nav-number">3.</span> <span class="nav-text">主备倒换和主从倒换</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#主主复制"><span class="nav-number">4.</span> <span class="nav-text">主主复制</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#数据分散集群"><span class="nav-number">5.</span> <span class="nav-text">数据分散集群</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#分布式事务算法：保持一致性"><span class="nav-number">6.</span> <span class="nav-text">分布式事务算法：保持一致性</span></a><ol class="nav-child"><li class="nav-item nav-level-5"><a class="nav-link" href="#2PC-二阶段提交"><span class="nav-number">6.1.</span> <span class="nav-text">2PC 二阶段提交</span></a></li><li class="nav-item nav-level-5"><a class="nav-link" href="#3PC-三阶段提交"><span class="nav-number">6.2.</span> <span class="nav-text">3PC 三阶段提交</span></a></li></ol></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#第八章-计算高可用"><span class="nav-number"></span> <span class="nav-text">第八章 计算高可用</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#主备"><span class="nav-number">1.</span> <span class="nav-text">主备</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#主从"><span class="nav-number">2.</span> <span class="nav-text">主从</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#对称集群（负载均衡集群）"><span class="nav-number">3.</span> <span class="nav-text">对称集群（负载均衡集群）</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#非对称集群"><span class="nav-number">4.</span> <span class="nav-text">非对称集群</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#第九章-业务高可用"><span class="nav-number"></span> <span class="nav-text">第九章 业务高可用</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#异地多活设计技巧"><span class="nav-number">1.</span> <span class="nav-text">异地多活设计技巧</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#异地多活设计步骤"><span class="nav-number">2.</span> <span class="nav-text">异地多活设计步骤</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#接口级故障应对方案"><span class="nav-number">3.</span> <span class="nav-text">接口级故障应对方案</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#降级"><span class="nav-number">4.</span> <span class="nav-text">降级</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#熔断："><span class="nav-number">5.</span> <span class="nav-text">熔断：</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#限流"><span class="nav-number">6.</span> <span class="nav-text">限流</span></a></li></ol></div>
      </div>
      <!--/noindex-->

      <div class="site-overview-wrap sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <img class="site-author-image" itemprop="image" alt="yanbing"
      src="/images/dog.jpg">
  <p class="site-author-name" itemprop="name">yanbing</p>
  <div class="site-description" itemprop="description">闲看庭前花开落，漫随天外云卷舒。</div>
</div>
<div class="site-state-wrap motion-element">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
          <a href="/archives/">
        
          <span class="site-state-item-count">59</span>
          <span class="site-state-item-name">日志</span>
        </a>
      </div>
      <div class="site-state-item site-state-categories">
            <a href="/categories/">
          
        <span class="site-state-item-count">14</span>
        <span class="site-state-item-name">分类</span></a>
      </div>
      <div class="site-state-item site-state-tags">
            <a href="/tags/">
          
        <span class="site-state-item-count">9</span>
        <span class="site-state-item-name">标签</span></a>
      </div>
  </nav>
</div>
  <div class="links-of-author motion-element">
      <span class="links-of-author-item">
        <a href="https://github.com/yanbingzn" title="GitHub → https:&#x2F;&#x2F;github.com&#x2F;yanbingzn" rel="noopener" target="_blank"><i class="fab fa-github fa-fw"></i>GitHub</a>
      </span>
      <span class="links-of-author-item">
        <a href="https://blog.csdn.net/i_silence" title="CSDN → https:&#x2F;&#x2F;blog.csdn.net&#x2F;i_silence" rel="noopener" target="_blank"><i class="fab fa-codiepie fa-fw"></i>CSDN</a>
      </span>
  </div>
  <div class="cc-license motion-element" itemprop="license">
    <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" class="cc-opacity" rel="noopener" target="_blank"><img src="/images/cc-by-nc-sa.svg" alt="Creative Commons"></a>
  </div>



      </div>

    </div>
  </aside>
  <div id="sidebar-dimmer"></div>


      </div>
    </main>

    <footer class="footer">
      <div class="footer-inner">
        

        
  <div class="beian"><a href="http://www.beian.miit.gov.cn/" rel="noopener" target="_blank">豫ICP备20019377号 </a>
  </div>

<div class="copyright">
  
  &copy; 
  <span itemprop="copyrightYear">2020</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">yanbing</span>
</div>

<span id="busuanzi_container_site_uv">
  本站访问次数：<span class="busuanzi-value" id="busuanzi_value_site_pv"></span>
</span>

        
<div class="busuanzi-count">
  <script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
    <span class="post-meta-item" id="busuanzi_container_site_uv" style="display: none;">
      <span class="post-meta-item-icon">
        <i class="fa fa-user"></i>
      </span>
      <span class="site-uv" title="总访客量">
        <span id="busuanzi_value_site_uv"></span>
      </span>
    </span>
</div>








      </div>
    </footer>
  </div>

  
  <script size="300" alpha="0.6" zIndex="-1" src="/lib/canvas-ribbon/canvas-ribbon.js"></script>
  <script src="/lib/anime.min.js"></script>
  <script src="/lib/velocity/velocity.min.js"></script>
  <script src="/lib/velocity/velocity.ui.min.js"></script>

<script src="/js/utils.js"></script>

<script src="/js/motion.js"></script>


<script src="/js/schemes/pisces.js"></script>


<script src="/js/next-boot.js"></script>




  
  <script>
    (function(){
      var canonicalURL, curProtocol;
      //Get the <link> tag
      var x=document.getElementsByTagName("link");
		//Find the last canonical URL
		if(x.length > 0){
			for (i=0;i<x.length;i++){
				if(x[i].rel.toLowerCase() == 'canonical' && x[i].href){
					canonicalURL=x[i].href;
				}
			}
		}
    //Get protocol
	    if (!canonicalURL){
	    	curProtocol = window.location.protocol.split(':')[0];
	    }
	    else{
	    	curProtocol = canonicalURL.split(':')[0];
	    }
      //Get current URL if the canonical URL does not exist
	    if (!canonicalURL) canonicalURL = window.location.href;
	    //Assign script content. Replace current URL with the canonical URL
      !function(){var e=/([http|https]:\/\/[a-zA-Z0-9\_\.]+\.baidu\.com)/gi,r=canonicalURL,t=document.referrer;if(!e.test(r)){var n=(String(curProtocol).toLowerCase() === 'https')?"https://sp0.baidu.com/9_Q4simg2RQJ8t7jm9iCKT-xh_/s.gif":"//api.share.baidu.com/s.gif";t?(n+="?r="+encodeURIComponent(document.referrer),r&&(n+="&l="+r)):r&&(n+="?l="+r);var i=new Image;i.src=n}}(window);})();
  </script>




  
<script src="/js/local-search.js"></script>













  

  


  
  <script type="text/javascript"
color="0,0,188" opacity='0.5' zIndex="-1" count="120" src="//cdn.bootcss.com/canvas-nest.js/1.0.0/canvas-nest.min.js"></script>
  

</body>
</html>
